/*
* Fireworks display on levelling up.
* Copyright (C) 2013 Andrew Stevanus (Hoot215) <hoot893@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package me.Hoot215.LevelFlare;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import me.Hoot215.LevelFlare.api.Leveller;
import me.Hoot215.LevelFlare.api.LevellerManager;
import me.Hoot215.LevelFlare.metrics.BukkitMetrics;
import me.Hoot215.updater.AutoUpdater;
import me.Hoot215.updater.AutoUpdaterQueue;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;
public class LevelFlare extends JavaPlugin
{
private LevelFlarePlayerListener playerListener;
private LevellerManager levellerManager;
private AutoUpdaterQueue autoUpdaterQueue;
private static final Color[] COLOURS = {Color.AQUA, Color.BLACK,
Color.BLUE, Color.FUCHSIA, Color.GRAY, Color.GREEN, Color.LIME,
Color.MAROON, Color.NAVY, Color.OLIVE, Color.ORANGE, Color.PURPLE,
Color.RED, Color.SILVER, Color.TEAL, Color.WHITE, Color.YELLOW};
public LevellerManager getLevellerManager ()
{
return levellerManager;
}
public void launchFireworks (Player player)
{
FileConfiguration config = this.getConfig();
for (String s : config.getStringList("fireworks"))
{
boolean flicker;
boolean trail;
Type type;
List<Color> colours = new ArrayList<Color>();
List<Color> fades = new ArrayList<Color>();
if (s.equals("RANDOM"))
{
flicker = new Random().nextBoolean();
trail = new Random().nextBoolean();
type =
Type.values()[new Random().nextInt(Type.values().length)];
for (int i = 0; i < 3; i++)
{
colours.add(COLOURS[new Random().nextInt(COLOURS.length)]);
fades.add(COLOURS[new Random().nextInt(COLOURS.length)]);
}
}
else
{
if (config.getConfigurationSection(s) == null)
{
this.getLogger().warning(
"Firework '" + s + "' does not exist in the config!");
continue;
}
flicker = config.getBoolean(s + ".flicker");
trail = config.getBoolean(s + ".trail");
String typeString = config.getString(s + ".type");
try
{
type = Type.valueOf(typeString);
}
catch (IllegalArgumentException e)
{
this.getLogger().warning(
"Invalid type specified for firework '" + s + "'!");
this.getLogger().warning("Using BALL instead");
type = Type.BALL;
}
catch (NullPointerException e)
{
this.getLogger().warning(
"Invalid type specified for firework '" + s + "'!");
this.getLogger().warning("Using BALL instead");
type = Type.BALL;
}
for (String t : config.getStringList(s + ".colours"))
{
try
{
colours.add((Color) Color.class.getField(t).get(null));
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (NoSuchFieldException e)
{
this.getLogger().warning(
"Invalid colour '" + t
+ "' specified for firework '" + s + "'!");
this.getLogger().warning("Using WHITE instead");
colours.add(Color.WHITE);
}
catch (SecurityException e)
{
e.printStackTrace();
}
}
for (String t : config.getStringList(s + ".fades"))
{
try
{
fades.add((Color) Color.class.getField(t).get(null));
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (NoSuchFieldException e)
{
this.getLogger().warning(
"Invalid fade '" + t + "' specified for firework '"
+ s + "'!");
this.getLogger().warning("Using WHITE instead");
fades.add(Color.WHITE);
}
catch (SecurityException e)
{
e.printStackTrace();
}
}
}
Firework firework =
(Firework) player.getWorld().spawnEntity(player.getLocation(),
EntityType.FIREWORK);
FireworkMeta meta = firework.getFireworkMeta();
FireworkEffect effect =
FireworkEffect.builder().flicker(flicker).trail(trail)
.with(type).withColor(colours).withFade(fades).build();
meta.addEffect(effect);
firework.setFireworkMeta(meta);
}
}
public boolean onCommand (CommandSender sender, Command cmd,
String commandLabel, String[] args)
{
if (cmd.getName().equals("levelflare"))
{
if (sender.hasPermission(cmd.getPermission()))
{
if (args.length == 0)
{
sender.sendMessage(ChatColor.GREEN + "/" + commandLabel
+ ChatColor.WHITE + " - Displays LevelFlare help");
sender.sendMessage(ChatColor.GREEN + "/" + commandLabel
+ " reload" + ChatColor.WHITE
+ " - Reloads config file");
sender.sendMessage(ChatColor.GREEN + "/" + commandLabel
+ " update" + ChatColor.WHITE
+ " - Checks for a newer version of LevelFlare");
sender.sendMessage(ChatColor.GREEN + "/" + commandLabel
+ " levellers" + ChatColor.WHITE
+ " - Lists loaded levellers");
sender.sendMessage(ChatColor.GREEN + "/" + commandLabel
+ " load <name>" + ChatColor.WHITE
+ " - Loads leveller <name>.jar");
sender.sendMessage(ChatColor.GREEN + "/" + commandLabel
+ " unload <name>" + ChatColor.WHITE
+ " - Unloads leveller <name>.jar");
return true;
}
if (args.length == 1)
{
if (args[0].equalsIgnoreCase("reload"))
{
if (sender.hasPermission("levelflare.reload"))
{
this.reloadConfig();
sender.sendMessage(ChatColor.GREEN
+ "Config reloaded!");
return true;
}
sender.sendMessage(cmd.getPermissionMessage());
return true;
}
if (args[0].equalsIgnoreCase("update"))
{
if (sender.hasPermission("levelflare.update"))
{
sender.sendMessage(ChatColor.BLUE
+ "Checking for a newer version "
+ "of LevelFlare...");
autoUpdaterQueue.add(sender);
return true;
}
sender.sendMessage(cmd.getPermissionMessage());
return true;
}
if (args[0].equalsIgnoreCase("levellers"))
{
if (sender.hasPermission("levelflare.levellers"))
{
sender.sendMessage(ChatColor.GREEN
+ "Currently loaded levellers:");
for (String s : this.getLevellerManager()
.getLevellerNames())
{
if (s == null)
break;
sender.sendMessage(ChatColor.DARK_GREEN + s);
}
return true;
}
sender.sendMessage(cmd.getPermissionMessage());
return true;
}
else
return false;
}
if (args.length == 2)
{
if (args[0].equalsIgnoreCase("load"))
{
if (sender.hasPermission("levelflare.load"))
{
String levellerName = args[1];
Leveller leveller =
this.getLevellerManager().loadLeveller(
levellerName);
if (leveller != null)
{
sender.sendMessage(ChatColor.GREEN
+ "Leveller '" + levellerName
+ "' loaded successfully");
}
else
{
sender.sendMessage(ChatColor.RED + "Leveller '"
+ levellerName
+ "' doesn't exist or is already loaded");
}
return true;
}
sender.sendMessage(cmd.getPermissionMessage());
return true;
}
if (args[0].equalsIgnoreCase("unload"))
{
if (sender.hasPermission("levelflare.unload"))
{
String levellerName = args[1];
if (this.getLevellerManager().unloadLeveller(
levellerName))
{
sender.sendMessage(ChatColor.GREEN
+ "Leveller '" + levellerName
+ "' unloaded successfully");
}
else
{
sender.sendMessage(ChatColor.RED + "Leveller '"
+ levellerName + "' isn't loaded");
}
return true;
}
sender.sendMessage(cmd.getPermissionMessage());
return true;
}
else
return false;
}
return false;
}
sender.sendMessage(cmd.getPermissionMessage());
return true;
}
return false;
}
@Override
public void onDisable ()
{
// Levellers
this.getLogger().info("Unloading levellers...");
this.getLevellerManager().unloadLevellers();
this.getLogger().info("Levellers unloaded");
// Auto updater
autoUpdaterQueue.add(null);
this.getLogger().info("Is now disabled");
}
@Override
public void onEnable ()
{
this.saveDefaultConfig();
this.getConfig().options().copyDefaults(true);
this.saveConfig();
String version = this.getServer().getVersion();
int start = version.lastIndexOf("-b") + 2;
int stop = version.lastIndexOf("jnks");
int build = 0;
try
{
build = Integer.valueOf(version.substring(start, stop));
if (build < 2565)
{
if (this.getConfig().getBoolean("allow-old-build"))
{
this.getLogger().warning(
"You are running an old version of Craftbukkit "
+ "but have forced the plugin to load");
this.getLogger().warning(
"The plugin may not work correctly");
}
else
{
this.getLogger()
.severe(
"You seem to be running an old "
+ "version of Craftbukkit! Build 2565 or higher is "
+ "required to use this plugin!");
this.getLogger()
.severe(
"Disabling plugin! You can force "
+ "the plugin to load by setting allow-old-build to "
+ "true in the config file");
this.getServer().getPluginManager().disablePlugin(this);
return;
}
}
}
catch (NumberFormatException e)
{
this.getLogger()
.warning(
"You seem to be running an unusual version "
+ "of Craftbukkit");
this.getLogger().warning(
"Please make sure that it is compatible with the changes "
+ "from build 2565+!");
}
catch (IndexOutOfBoundsException e)
{
this.getLogger()
.warning(
"You seem to be running an unusual version "
+ "of Craftbukkit");
this.getLogger().warning(
"Please make sure that it is compatible with the changes "
+ "from build 2565+!");
}
if (build != 0)
{
this.getLogger().info("Detected build " + String.valueOf(build));
}
playerListener = new LevelFlarePlayerListener(this);
this.getServer().getPluginManager()
.registerEvents(playerListener, this);
try
{
BukkitMetrics metrics = new BukkitMetrics(this);
metrics.start();
}
catch (IOException e)
{
e.printStackTrace();
}
// Levellers
levellerManager = new LevellerManager(this);
this.getLogger().info("Loading levellers...");
levellerManager.loadLevellers();
this.getLogger().info("Levellers loaded");
// Auto updater
AutoUpdater autoUpdater = new AutoUpdater(this);
autoUpdater.start();
autoUpdaterQueue = new AutoUpdaterQueue(autoUpdater, this.getName());
autoUpdaterQueue.start();
this.getLogger().info("Is now enabled");
}
}